這題真的需要花一點功夫,題目並不難懂,但是不能用直觀的方式去寫,可以上網搜尋關鍵字「find cycle in directed graph」,以及前一篇所提到的「depth-first search」(DFS)。
題目
輸入輸出格式
Sol.
我採用的作法會先將題目給的資訊整理成陣列:
whiteSet
、graySet
、blackSet
:whiteSet
:還沒判斷過的點graySet
:正在判斷或已判斷的點blackSet
:不用再判斷的點,有可能是因為沒有與其連接的點,或其所連接的點不屬於需要判斷的點pathArray
,長度為總 node 數量,並將陣列中各項初始化為 -1,存目前已經過的點Pseudocode
建 adjacencyMatrix、selectArray
建 whiteSet、graySet、blackSet
若是沒有要判斷是否有迴圈的點就先放入blackSet,其餘在whiteSet中皆表示1
建 pathArray
int path = 0; // 接下來這個點要放在 pathArray 中的哪
bool cycle = false; // 是否有迴圈
bool neighbor = false; // 有沒有與之連接的點
int i = 0; // 現在判斷到第幾個點
// 開始判斷
While (cycle == false或i>= pointQ)
如果根本就不夠判斷是否有迴圈就直接 break
// 判斷這個點有沒有在blackSet中
bool blackFlag = true;
if遍歷完blackFlag還是true代表不用再判斷,這時就break
// 不用判斷這個點就跳過繼續判斷下一個點
if (blackSet[i] == 1)
i++ 並continue
// 如果這個點可以拿來判斷
if (whiteSet[i] == 1 && graySet[i] == 0)
whiteSet[i] = 0;
graySet[i] = 1;
pathArray[path] = i;
path++;
// 找有沒有與之相鄰的 (這個方法真的太聰明..一定要好好學起來)
for u in range 0~nodes總數
neighbor = false;
// 把所有沒有neighbor的情形都判斷完後neighbor 就會是true
neighbor = true;
if 第u個點是在whiteSet中
whiteSet[u] = 0;
graySet[u] = 1;
pathArray[path] = u;
path++;
i = u;
else if 第u個點是在graySet中
cycle = true;
break;
// 若沒有點與之相鄰了就代表這個點沒用了,把他放到 blackSet
if neighbor == false
whiteSet[i]、graySet[i] = 0
blackSet[i] = 1
// 在pathArray中刪除這格
path--;
pathArray[path] = -1;
讓 i 回到pathArray中最後一個不為 -1 的點
最後輸出cycle